/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package nexus.criterios;


import control.MessageFactory;
import java.util.ArrayList;
import java.util.List;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.el.VariableResolver;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import org.apache.myfaces.custom.tree2.TreeNodeBase;


import control.UserBean;
import javax.faces.application.FacesMessage;
import javax.swing.JOptionPane;
import nexus.criterios.exp.ControlFormula;

/**
 *
 * @author juampi
 */
public class ConfiguracionCriterio {
    private String nombreCrierioCalificacionNodoActual;
    private String nombreCriterioCalificacionActual;
    private String nombreNuevoNodo;
    private TreeNodeBase nodoActual;
    private CriterioCalificacion criterioSeleccionado;
    private String nombreNodoHijoSeleccionado;
    private ArrayList<SelectItem> listaNodosHijos;
    private ArrayList<SelectItem> itemsCriteriosCalificacionActuales;
    private boolean mostrarOpcionesNodoIntermedio;
    private boolean mostrarOpcionesNodoHoja;
    private boolean mostrarPanelCreacionNodo;
    private boolean mostrarPanelEliminar;
    private boolean mostaraPanelAsigacionCriterioCalificacion;
    private boolean mostrarOpcionesNodoRaiz;
    private String nombreCriterioActual;
    static final String NODO_HOJA="nodoEvaluacionHoja";
    static final String NODO_INTERMEDIO="nodoEvaluacion";
    private ArrayList<CriterioCalificacion> listaCriteriosCalificacion;
    private ArrayList<CriterioCalificacionCuantitativo> listaCriteriosCuantitativos;
    private ArrayList<CriterioCalificacionCualitativo> listaCriterioCualitatitivos;

    public void actionNodoItermedioSeleccionado(ActionEvent event) {
        borrarTodosMostrar();
        UIParameter component = (UIParameter) event.getComponent().findComponent("nodoEvaluacion");
        nodoActual = (TreeNodeBase) component.getValue();
        nombreCrierioCalificacionNodoActual = getNombreCrierioCalificacionNodoActual();
        if(nodoActual.getChildren().size()==0) {
            mostrarOpcionesNodoHoja = true;
        }else {
            mostrarOpcionesNodoIntermedio = true;
        }  
    }
    public void actionNodoHojaSeleccionado(ActionEvent event) {
        UIParameter component = (UIParameter) event.getComponent().findComponent("nodoEvaluacionHoja");
        nodoActual = (TreeNodeBase) component.getValue();
        mostrarOpcionesNodoHoja = true;
    }
    public void actionCrearSubcriterio(ActionEvent event ) {
        borrarTodosMostrar();
        mostrarPanelCreacionNodo = true;
    }
    public void actionAceptarCreacionSubcriterio(ActionEvent event ) {
        NodoEvaluacion ne = new NodoEvaluacion(NODO_HOJA, nombreNuevoNodo, "", true);
        FacesContext context = FacesContext.getCurrentInstance();
        VariableResolver vr = context.getApplication().getVariableResolver();
        CriterioTree ct = (CriterioTree)vr.resolveVariable(context, "criterioTree");

        if(!ct.verificarExisteCriterioEvaluacion(nombreNuevoNodo)) {
            nodoActual.getChildren().add(ne);
            GestorCriteriosDB.getInstance().crearCriterioEvaluacion(nombreNuevoNodo, nodoActual.getIdentifier());
            FacesMessage mensaje = MessageFactory.createMessage(FacesMessage.SEVERITY_ERROR, "creacionCorecctaCriteriEvaluacion","");
            FacesContext.getCurrentInstance().addMessage(null, mensaje);
        }else {
            FacesMessage mensaje = MessageFactory.createMessage(FacesMessage.SEVERITY_ERROR, "errorNombreDuplicadoCriterioEvaluacion","");
            FacesContext.getCurrentInstance().addMessage(null, mensaje);
        }
    }
    public void actionEliminarSubcriterios(ActionEvent event ) {
        borrarTodosMostrar();
        mostrarPanelEliminar = true;
    }
    public void actionAceptarElimnarSubcriterios(ActionEvent event) {
        
        /*for (SelectItem selectItem : listaNodosHijos) {
            if(selectItem.getValue().equals(nombreNodoHijoSeleccionado)) {
                listaNodosHijos.remove(selectItem);
            }
        }*/
        //JOptionPane.showMessageDialog(null, "el nodo a elimnar "+nombreNodoHijoSeleccionado);
        GestorCriteriosDB.getInstance().eliminarCriterioEvaluacion(nombreNodoHijoSeleccionado);
        FacesMessage mensaje = MessageFactory.createMessage(FacesMessage.SEVERITY_ERROR, "eliminacionCorrectaNodoEvaluacion", "");
        FacesContext.getCurrentInstance().addMessage(null, mensaje);
       /* List listaHijos = nodoActual.getChildren();
        for (Object object : listaHijos) {
            if(object instanceof NodoEvaluacion) {
                NodoEvaluacion nodoEva = (NodoEvaluacion)object;
                if(nodoEva.getIdentifier().equalsIgnoreCase(nombreNodoHijoSeleccionado)) {
                    //JOptionPane.showMessageDialog(null, "entro a segndo if "+nombreNodoHijoSeleccionado);
                    nodoActual.getChildren().remove(nodoEva);
                }
            }
        }*/
    }
    public void actionAsignarCriterioCalificacion(ActionEvent event) {
        borrarTodosMostrar();
        mostaraPanelAsigacionCriterioCalificacion = true;
    }
    public void actionConfigurarFormula(ActionEvent event ) {

    }
    public void actionAsignarCriterioCalificacionSeleccionado(ActionEvent event) {
        //asigna al nodo actual el criteri criterioSeleccionado
        if(nodoActual instanceof NodoEvaluacion) {
            NodoEvaluacion nodoEva = (NodoEvaluacion)nodoActual;
           // JOptionPane.showMessageDialog(null,nodoActual.getIdentifier()+"--"+nombreCriterioCalificacionActual );
            GestorCriteriosDB.getInstance().asignarCriterioCalificacion(nodoActual.getIdentifier(), nombreCriterioCalificacionActual);
            nodoEva.setCriterio(GestorCriteriosDB.getInstance().obtenerCriterioCalificacion(nombreCriterioCalificacionActual));
            String cadenaMensaje = "Se Asignno Correctamente el criterio calificacion "+criterioSeleccionado.getNombreCriterio()+" al criterio de evaluacion "+nodoActual.getDescription();
            FacesMessage mensage = new FacesMessage(cadenaMensaje, cadenaMensaje);
            FacesContext.getCurrentInstance().addMessage(null, mensage);
        } else {
            JOptionPane.showMessageDialog(null, "Error de nodo");
        }
    }
    public void actionDesasignarCriterioCalificacion(ActionEvent event) {
        if(nodoActual instanceof NodoEvaluacion) {
            //JOptionPane.showMessageDialog(null, "este nodo "+nodoActual.getIdentifier());
            NodoEvaluacion nodoEva = (NodoEvaluacion)nodoActual;
            nodoEva.setCriterio(null);
            GestorCriteriosDB.getInstance().quitarCriterioCalificacion(nodoActual.getIdentifier());
        } else {
            JOptionPane.showMessageDialog(null, "Error de nodo");
        }
    }
    public String actionIrAFormula() {
        FacesContext context = FacesContext.getCurrentInstance();
        VariableResolver vr = context.getApplication().getVariableResolver();
        ControlFormula formula = (ControlFormula)vr.resolveVariable(context, "formula");
        formula.init(nodoActual.getIdentifier());
        return "irAEditarFormula";
    }
    public void guardarCriterioActualSeleccionado(ActionEvent event) {
        UIParameter component = (UIParameter) event.getComponent().findComponent("codigoCriterioCalificacion");
        criterioSeleccionado = (CriterioCalificacion)component.getValue();
        nombreCriterioCalificacionActual = criterioSeleccionado.getNombreCriterio();
        if(criterioSeleccionado instanceof CriterioCalificacionCualitativo) {
        }
        if(criterioSeleccionado instanceof CriterioCalificacionCuantitativo) {

        }
    }
    /**
     * @return the nombreNuevoNodo
     */
    public String getNombreNuevoNodo() {
        return nombreNuevoNodo;
    }

    /**
     * @param nombreNuevoNodo the nombreNuevoNodo to set
     */
    public void setNombreNuevoNodo(String nombreNuevoNodo) {
        this.nombreNuevoNodo = nombreNuevoNodo;
    }

    /**
     * @return the nodoActual
     */
    public TreeNodeBase getNodoActual() {
        return nodoActual;
    }

    /**
     * @param nodoActual the nodoActual to set
     */
    public void setNodoActual(TreeNodeBase nodoActual) {
        this.nodoActual = nodoActual;
    }

    /**
     * @return the criterioSeleccionado
     */
    public CriterioCalificacion getCriterioSeleccionado() {
        return criterioSeleccionado;
    }

    /**
     * @param criterioSeleccionado the criterioSeleccionado to set
     */
    public void setCriterioSeleccionado(CriterioCalificacion criterioSeleccionado) {
        this.criterioSeleccionado = criterioSeleccionado;
    }

    /**
     * @return the nombreNodoHijoSeleccionado
     */
    public String getNombreNodoHijoSeleccionado() {
        return nombreNodoHijoSeleccionado;
    }

    /**
     * @param nombreNodoHijoSeleccionado the nombreNodoHijoSeleccionado to set
     */
    public void setNombreNodoHijoSeleccionado(String nombreNodoHijoSeleccionado) {
        this.nombreNodoHijoSeleccionado = nombreNodoHijoSeleccionado;
    }

    /**
     * @return the listaNodosHijos
     */
    public ArrayList<SelectItem> getListaNodosHijos() {
        listaNodosHijos =  new ArrayList<SelectItem>();
        List nodosHijos = nodoActual.getChildren();
        for (Object object : nodosHijos) {
            if(object instanceof NodoEvaluacion) {
                NodoEvaluacion nodoHijo = (NodoEvaluacion) object;
                SelectItem item = new SelectItem(nodoHijo.getIdentifier(),nodoHijo.getDescription());
                listaNodosHijos.add(item);
            }
        }
        return listaNodosHijos;
    }

    /**
     * @param listaNodosHijos the listaNodosHijos to set
     */
    public void setListaNodosHijos(ArrayList<SelectItem> listaNodosHijos) {
        this.listaNodosHijos = listaNodosHijos;
    }

    /**
     * @return the mostrarOpcionesNodoIntermedio
     */
    public boolean isMostrarOpcionesNodoIntermedio() {
        return mostrarOpcionesNodoIntermedio;
    }

    /**
     * @param mostrarOpcionesNodoIntermedio the mostrarOpcionesNodoIntermedio to set
     */
    public void setMostrarOpcionesNodoIntermedio(boolean mostrarOpcionesNodoIntermedio) {
        this.mostrarOpcionesNodoIntermedio = mostrarOpcionesNodoIntermedio;
    }

    /**
     * @return the mostrarOpcionesNodoHoja
     */
    public boolean isMostrarOpcionesNodoHoja() {
        return mostrarOpcionesNodoHoja;
    }

    /**
     * @param mostrarOpcionesNodoHoja the mostrarOpcionesNodoHoja to set
     */
    public void setMostrarOpcionesNodoHoja(boolean mostrarOpcionesNodoHoja) {
        this.mostrarOpcionesNodoHoja = mostrarOpcionesNodoHoja;
    }

    /**
     * @return the mostrarPanelCreacionNodo
     */
    public boolean isMostrarPanelCreacionNodo() {
        return mostrarPanelCreacionNodo;
    }

    /**
     * @param mostrarPanelCreacionNodo the mostrarPanelCreacionNodo to set
     */
    public void setMostrarPanelCreacionNodo(boolean mostrarPanelCreacionNodo) {
        this.mostrarPanelCreacionNodo = mostrarPanelCreacionNodo;
    }

    /**
     * @return the mostrarPanelEliminar
     */
    public boolean isMostrarPanelEliminar() {
        return mostrarPanelEliminar;
    }

    /**
     * @param mostrarPanelEliminar the mostrarPanelEliminar to set
     */
    public void setMostrarPanelEliminar(boolean mostrarPanelEliminar) {
        this.mostrarPanelEliminar = mostrarPanelEliminar;
    }

    /**
     * @return the mostaraPanelAsigacionCriterioCalificacion
     */
    public boolean isMostrarPanelAsigacionCriterioCalificacion() {
        return mostaraPanelAsigacionCriterioCalificacion;
    }

    /**
     * @param mostaraPanelAsigacionCriterioCalificacion the mostaraPanelAsigacionCriterioCalificacion to set
     */
    public void setMostaraPanelAsigacionCriterioCalificacion(boolean mostaraPanelAsigacionCriterioCalificacion) {
        this.mostaraPanelAsigacionCriterioCalificacion = mostaraPanelAsigacionCriterioCalificacion;
    }

    /**
     * @return the nombreCriterioActual
     */
    public String getNombreCriterioActual() {
        if(nodoActual==null) {
            return "Debe Seleccionar un nodo";
        }else {
            return nodoActual.getDescription();
        }
    }

    /**
     * @param nombreCriterioActual the nombreCriterioActual to set
     */
    public void setNombreCriterioActual(String nombreCriterioActual) {
        this.nombreCriterioActual = nombreCriterioActual;
    }

    /**
     * @return the listaCriteriosCalificacion
     */
    public ArrayList<CriterioCalificacion> getListaCriteriosCalificacion() {
        listaCriteriosCalificacion = new ArrayList<CriterioCalificacion>();
        ArrayList<CriterioCalificacion> lista = GestorCriteriosDB.getInstance().listarCriteriosCalificacionUsuario(getUser().getId());
        if(lista!=null) {
            listaCriteriosCalificacion = lista;
        } else {
            JOptionPane.showMessageDialog(null, "la lista es nula");
        }
        return listaCriteriosCalificacion;
    }
    /**
     * @param listaCriteriosCalificacion the listaCriteriosCalificacion to set
     */
    public void setListaCriteriosCalificacion(ArrayList<CriterioCalificacion> listaCriteriosCalificacion) {
        this.listaCriteriosCalificacion = listaCriteriosCalificacion;
    }
    public void borrarTodosMostrar() {
        mostaraPanelAsigacionCriterioCalificacion = false;
        mostrarOpcionesNodoHoja = false;
        mostrarOpcionesNodoIntermedio = false;
        mostrarPanelCreacionNodo = false;
        mostrarPanelEliminar = false;
        mostrarOpcionesNodoRaiz = false;
    }
    public UserBean getUser() {
        FacesContext context = FacesContext.getCurrentInstance();
        VariableResolver vr = context.getApplication().getVariableResolver();
        UserBean bean = (UserBean)vr.resolveVariable(context, "userBean");
        return bean;
    }

    /**
     * @return the nombreCriterioCalificacionActual
     */
    public String getNombreCriterioCalificacionActual() {

        return nombreCriterioCalificacionActual;
    }

    /**
     * @param nombreCriterioCalificacionActual the nombreCriterioCalificacionActual to set
     */
    public void setNombreCriterioCalificacionActual(String nombreCriterioCalificacionActual) {
        this.nombreCriterioCalificacionActual = nombreCriterioCalificacionActual;
    }

    /**
     * @return the itemsCriteriosCalificacionActuales
     */
    public ArrayList<SelectItem> getItemsCriteriosCalificacionActuales() {
        itemsCriteriosCalificacionActuales = new ArrayList<SelectItem>();
        ArrayList<CriterioCalificacion> criterios = GestorCriteriosDB.getInstance().listarCriteriosCalificacionUsuario(getUser().getId());
        for (CriterioCalificacion criterioCalificacion : criterios) {
            SelectItem item  = new SelectItem(criterioCalificacion.getNombreCriterio(),criterioCalificacion.getNombreCriterio());
            itemsCriteriosCalificacionActuales.add(item);
        }
        return itemsCriteriosCalificacionActuales;
    }

    /**
     * @param itemsCriteriosCalificacionActuales the itemsCriteriosCalificacionActuales to set
     */
    public void setItemsCriteriosCalificacionActuales(ArrayList<SelectItem> itemsCriteriosCalificacionActuales) {
        this.itemsCriteriosCalificacionActuales = itemsCriteriosCalificacionActuales;
    }
    
    /**
     * @return the nombreCrierioCalificacionNodoActual
     */
    public String getNombreCrierioCalificacionNodoActual() {

        nombreCrierioCalificacionNodoActual = "ninguno";
        //JOptionPane.showMessageDialog(null, "entro al get nombre calificaicon nodo actual");
        if(nodoActual !=null && nodoActual instanceof NodoEvaluacion) {
            NodoEvaluacion nodoEva = (NodoEvaluacion)nodoActual;
            //JOptionPane.showMessageDialog(null,nodoEva.getIdentifier()+ " entro al get nombre calificaicon nodo actual al if"+nodoEva.getDescription()+"--"+nodoEva.getCriterio());
            
            CriterioEvaluacion ce = GestorCriteriosDB.getInstance().recuperarCriterioEvaluacion(nodoActual.getIdentifier());
            if(ce.getCriterioCalificacion()!=null) {
                nombreCrierioCalificacionNodoActual = ce.getCriterioCalificacion().getNombreCriterio();
            }

        }
        return nombreCrierioCalificacionNodoActual;
    }

    /**
     * @param nombreCrierioCalificacionNodoActual the nombreCrierioCalificacionNodoActual to set
     */
    public void setNombreCrierioCalificacionNodoActual(String nombreCrierioCalificacionNodoActual) {
        this.nombreCrierioCalificacionNodoActual = nombreCrierioCalificacionNodoActual;
    }

    /**
     * @return the listaCriteriosCuantitativos
     */
    public ArrayList<CriterioCalificacionCuantitativo> getListaCriteriosCuantitativos() {
       
        listaCriteriosCuantitativos  = new ArrayList<CriterioCalificacionCuantitativo>();
        ArrayList<CriterioCalificacion> ltcc = GestorCriteriosDB.getInstance().listarCriteriosCalificacionUsuario(getUser().getId());
        for (CriterioCalificacion criterioCalificacion : ltcc) {
            if(criterioCalificacion instanceof CriterioCalificacionCuantitativo) {
                listaCriteriosCuantitativos.add((CriterioCalificacionCuantitativo)criterioCalificacion);
            }
        }
        return listaCriteriosCuantitativos;
    }

    /**
     * @param listaCriteriosCuantitativos the listaCriteriosCuantitativos to set
     */
    public void setListaCriteriosCuantitativos(ArrayList<CriterioCalificacionCuantitativo> listaCriteriosCuantitativos) {
        this.listaCriteriosCuantitativos = listaCriteriosCuantitativos;
    }

    /**
     * @return the listaCriterioCualitatitivos
     */
    public ArrayList<CriterioCalificacionCualitativo> getListaCriterioCualitatitivos() {
        listaCriterioCualitatitivos  = new ArrayList<CriterioCalificacionCualitativo>();
        ArrayList<CriterioCalificacion> ltcccu = GestorCriteriosDB.getInstance().listarCriteriosCalificacionUsuario(getUser().getId());
        for (CriterioCalificacion criterioCalificacion : ltcccu) {
            if(criterioCalificacion instanceof CriterioCalificacionCualitativo) {
                listaCriterioCualitatitivos.add((CriterioCalificacionCualitativo)criterioCalificacion);
            }
        }
        return listaCriterioCualitatitivos;
    }

    /**
     * @param listaCriterioCualitatitivos the listaCriterioCualitatitivos to set
     */
    public void setListaCriterioCualitatitivos(ArrayList<CriterioCalificacionCualitativo> listaCriterioCualitatitivos) {
        this.listaCriterioCualitatitivos = listaCriterioCualitatitivos;
    }
    public void actionMostrarOpcionesRaiz(ActionEvent event) {
        borrarTodosMostrar();
        mostrarOpcionesNodoRaiz = true;
        UIParameter component = (UIParameter) event.getComponent().findComponent("nodoEvaluacionRaiz");
        nodoActual = (TreeNodeBase) component.getValue();
    }

    /**
     * @return the mostrarOpcionesNodoRaiz
     */
    public boolean isMostrarOpcionesNodoRaiz() {
        return mostrarOpcionesNodoRaiz;
    }

    /**
     * @param mostrarOpcionesNodoRaiz the mostrarOpcionesNodoRaiz to set
     */
    public void setMostrarOpcionesNodoRaiz(boolean mostrarOpcionesNodoRaiz) {
        this.mostrarOpcionesNodoRaiz = mostrarOpcionesNodoRaiz;
    }
    public void reiniciarValores() {

    }
}
